Transactions affecting data values stored in a database are tracked and assigned a transaction identifier. Whenever a transaction makes a change to a database block (or simply, “data block”), a database system creates a transaction entry that is stored in the database block. Each transaction entry references a transaction table entry. A “system commit number” or “system change number” (SCN) is assigned to a transaction when the transaction is committed.
Before a version of a data item is supplied to an active transaction, the database system determines a logical time value associated with the version of the data item. Depending on the logical time value, the database system determines whether the particular version of the data item can be provided to the active transaction. The logical time value represents a time that is at least as recent as the commit time of the committed transaction that most recently updated the version of the data item. This time value may be determined, for example, by identifying the most recent commit time of transactions that are identified in a list head associated with the data item. A logical time value may be in the form of an SCN. Traditionally, logical time values are internal system values that are available only to the database system.